Матч
422, Простой футбол (PrimeSoccer)
Дивизион 2,
Уровень 2
Вы смотрите футбольный матч и
хотите вычислить вероятность того, что хотя бы одна из команд забьет такое
количество голов, которое является простым числом. Игра длится 90 минут. Весь
матч разделим на 18 пятиминутных интервалов: от 0 до 5 минуты, от 5 до 10
минуты и так далее. Вероятность забить гол первой командой за любую пятиминутку
равна skillOfTeamA, а второй skillOfTeamB.
В течение каждой пятиминутки каждая из команд может забить не более одного
гола.
Класс: PrimeSoccer
Метод: double
getProbability(int skillOfTeamA, int skillOfTeamB)
Ограничения: 0 £ skillOfTeamA, skillOfTeamB £ 100.
Вход. Два целых числа skillOfTeamA и skillOfTeamB, задающие вероятность
забить гол соответственно первой и второй командой за одну пятиминутку.
Выход. Вероятность того, что хотя бы одна из команд забьет такое
количество голов, которое является простым числом.
Пример входа
skillOfTeamA |
skillOfTeamB |
50 |
50 |
100 |
100 |
12 |
89 |
Пример выхода
0.5265618908306351
0.0
0.6772047168840167
РЕШЕНИЕ
вероятность
Обозначим вероятность того, что
первая команда забьет количество голов, являющееся простым числом, через pa. Для второй команды эту вероятность
обозначим через pb. Поскольку события
забивания голов первой и второй командой независимы, то искомая вероятность
равна
1 – (1 – pa) * (1 – pb) = pa + pb
– pa * pb
Весь матч состоит из 18
пятиминуток, поэтому забито каждой командой может не более 18 голов. Для
каждого простого значения p, меньшего
18, следует вычислить вероятность того, что каждая их команд забьет в точности p мячей. Просуммировав эти вероятности
для каждой команды, получим значения pa
и pb.
k голов команда может забить, забивая в некоторые из k указанных пятиминуток по одному голу, а в остальные пятиминутки
не забивая ни одного. Пусть s –
вероятность забить гол командой в одну пятиминутку. Тогда вероятность того, что
команда забьет мячи в некоторых конкретных k
пятиминутках, равна sk *
(1 – s)18 – k. Всего разных k
пятиминуток существует . Поэтому вероятность того, что команда забьет ровно k голов, равна. Искомая вероятность pa
равна
Аналогично вычисляется
вероятность pb.
ПРОГРАММА
#include <stdio.h>
#include <math.h>
int i, primes[7] = {2, 3, 5, 7, 11, 13, 17};
double fact(int n)
{
return (!n) ? 1 : n * fact(n - 1);
}
class PrimeSoccer
{
public:
double getProbability(int
skillOfTeamA, int skillOfTeamB)
{
double pa, pb, sa = skillOfTeamA /
100.0, sb = skillOfTeamB / 100.0,
f18 =
fact(18);
for(pa = pb = i = 0; i < 7; i++)
{
pa += f18 / fact(primes[i]) / fact(18 - primes[i]) *
pow(sa, primes[i]) * pow(1 - sa, 18 - primes[i]);
pb += f18 / fact(primes[i]) / fact(18 - primes[i]) *
pow(1.0 * sb,
primes[i]) * pow(1.0 - sb, 18 - primes[i]);
}
return pa + pb - pa * pb;
}
};